return [null, null];
}
- _onScreenshotComplete(area, stream, file, flash, invocation) {
- if (flash) {
- let flashspot = new Flashspot(area);
- flashspot.fire(() => {
- this._removeShooterForSender(invocation.get_sender());
+ _flashAsync(shooter) {
+ return new Promise((resolve, _reject) => {
+ shooter.connect('screenshot_taken', (s, area) => {
+ const flashspot = new Flashspot(area);
+ flashspot.fire(resolve);
+
+ global.display.get_sound_player().play_from_theme(
+ 'screen-capture', _('Screenshot taken'), null);
});
- } else {
- this._removeShooterForSender(invocation.get_sender());
- }
+ });
+ }
+ _onScreenshotComplete(stream, file, invocation) {
stream.close(null);
let filenameUsed = '';
return;
try {
- let [area] =
- await screenshot.screenshot_area(x, y, width, height, stream);
- this._onScreenshotComplete(area, stream, file, flash, invocation);
+ await Promise.all([
+ flash ? this._flashAsync(screenshot) : null,
+ screenshot.screenshot_area(x, y, width, height, stream),
+ ]);
+ this._onScreenshotComplete(stream, file, invocation);
+ this._removeShooterForSender(invocation.get_sender());
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
return;
try {
- let [area] =
- await screenshot.screenshot_window(includeFrame, includeCursor, stream);
- this._onScreenshotComplete(area, stream, file, flash, invocation);
+ await Promise.all([
+ flash ? this._flashAsync(screenshot) : null,
+ screenshot.screenshot_window(includeFrame, includeCursor, stream),
+ ]);
+ this._onScreenshotComplete(stream, file, invocation);
+ this._removeShooterForSender(invocation.get_sender());
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
return;
try {
- let [area] = await screenshot.screenshot(includeCursor, stream);
- this._onScreenshotComplete(area, stream, file, flash, invocation);
+ await Promise.all([
+ flash ? this._flashAsync(screenshot) : null,
+ screenshot.screenshot(includeCursor, stream),
+ ]);
+ this._onScreenshotComplete(stream, file, invocation);
+ this._removeShooterForSender(invocation.get_sender());
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
SHELL_SCREENSHOT_AREA,
} ShellScreenshotMode;
+enum
+{
+ SCREENSHOT_TAKEN,
+
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0, };
+
typedef struct _ShellScreenshotPrivate ShellScreenshotPrivate;
struct _ShellScreenshot
static void
shell_screenshot_class_init (ShellScreenshotClass *screenshot_class)
{
- (void) screenshot_class;
+ signals[SCREENSHOT_TAKEN] =
+ g_signal_new ("screenshot-taken",
+ G_TYPE_FROM_CLASS(screenshot_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 1,
+ META_TYPE_RECTANGLE);
}
static void
draw_cursor_image (priv->image, priv->screenshot_area);
}
+ g_signal_emit (screenshot, signals[SCREENSHOT_TAKEN], 0, &rect);
+
task = g_task_new (screenshot, NULL, on_screenshot_written, result);
g_task_run_in_thread (task, write_screenshot_thread);
g_object_unref (task);
grab_screenshot (screenshot, priv->flags, result);
}
+ g_signal_emit (screenshot, signals[SCREENSHOT_TAKEN], 0,
+ (cairo_rectangle_int_t *) &priv->screenshot_area);
+
meta_enable_unredirect_for_display (display);
}
if (meta_is_wayland_compositor ())
{
grab_screenshot (screenshot, flags, result);
+
+ g_signal_emit (screenshot, signals[SCREENSHOT_TAKEN], 0,
+ (cairo_rectangle_int_t *) &priv->screenshot_area);
}
else
{
priv->screenshot_area.height,
SHELL_SCREENSHOT_FLAG_NONE);
+ g_signal_emit (screenshot, signals[SCREENSHOT_TAKEN], 0,
+ (cairo_rectangle_int_t *) &priv->screenshot_area);
+
task = g_task_new (screenshot, NULL, on_screenshot_written, result);
g_task_run_in_thread (task, write_screenshot_thread);
}